package com.book.system.filter;


import com.alibaba.fastjson.JSON;
import com.book.system.common.R;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author oath
 * 登陆拦截器过滤
 */
@Slf4j
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    /*
    登陆拦截器并不是拦截所有
    登陆拦截器的作用：
        用来判断当前的操作是否需要经过登陆 =》 登陆验证（判断 session中是否存在 ）
            1.登陆
            2.退出
            3.静态页面
        什么需要拦截，需要经过登陆验证
            需要前后端数据交互的
            拦截之后需要进行的处理
            判断当前拦截的url是否需要放行
        需要处理 =》 怎么处理 判断session 是否存在用户
            存在，代表登陆了，可以放行
            不存在，需要登陆，无权访问
     */


    public boolean check(String[] urls, String uri) {
        for (String url : urls) {
            if (uri.startsWith(url)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, javax.servlet.FilterChain filterChain) throws IOException, ServletException {
        //定义需要放行的url
        String[] urls = new String[]{
                "/css/",
                "/api/",
                "/js/",
                "/img/",
                "/view/",
                "/index.html",
                "/login.html",
                "/user",
        };
        //获取uri
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String uri = request.getRequestURI();
        log.info("================URI:" + uri);

        //判断是否属于放行url
        if (check(urls, uri) || "/".equals(uri)) {
            log.info("=================不需要登陆");
            filterChain.doFilter(request, response);
            return;
        }

        //2.判断用户是否登陆
        if (request.getSession().getAttribute("user") != null) {
            log.info("==================用户已经登陆");
            filterChain.doFilter(request, response);
            return;
        }
        //不属于放行，也没有登陆
        log.info("============未登录");
        response.getWriter().write(JSON.toJSONString(R.error(-1, "NOTLOGIN")));
        return;
    }

    @Override
    public void destroy() {

    }
}